package top.tresman.cxxcommon.entity.constants;

import top.tresman.cxxcommon.entity.sms.SceneEnum;

/**
 * Redis 常量类说明
 * 命名规范：
 * 1. 常量名全部大写，并且全部私有化
 * 2. 除使用string存储类型外，所有常量都以在 redis 中存储使用的数据类型 + _KEY 结尾 _MAP_KEY 代表id => 数据对象 json 的 HASH，例如： LOGIN_KEY 表示存储用户登录信息，存储类型为 string； PERMISSION_SET_KEY 表示存储用户权限信息，存储类型为 set。
 * 3. 常量值表示存储在 redis 中的 key 值，例如： LOGIN_KEY = 'login:{token}'，其中 login:{token} 表示存储用户登录信息的 key 值。
 * 4. 常量值中可以使用占位符，例如： LOGIN_KEY = 'login:{token}'，其中 {token} 表示占位符，表示在存储时需要替换为实际的 token 值。
 * 4. 简单的常量值中也可以直接使用%s等字符，例如： LOGIN_KEY = 'login:%s'，其中 %s 表示需要填充字符串，在存储时需要替换为实际的 token 值。
 * 5. 所有需要在本类外获取的常量值都应该写对应 KEY 的 get 方法，例如： public static function getLoginKey($token) { return 'login:' . $token; }
 * 6. 常量值如果需要做分割，以英文 : 作分隔符
 *
 * @author: cxx
 * @date : 2024/11/05
 */
public class BaseRedisConstant {
    protected static final String LOGIN_KEY = "login:%s:%s";
    protected static final String USER_TOKEN_SET_KEY = "userToken:%s:%d";
    protected static final String STS_TOKEN_KEY = "sts:%s";
    protected static final String SMS_CODE_KEY = "sms:code:%s:%s:%s";
    protected static final String ROLE_MAP_KEY = "map:roles";

    public static String getLoginKey(String tokenPrefix, String token) {
        return String.format(LOGIN_KEY, tokenPrefix, token);
    }

    public static String getUserTokenSetKey(String tokenPrefix, Integer userId) {
        return String.format(USER_TOKEN_SET_KEY, tokenPrefix, userId);
    }

    public static String getRoleMapKey() {
        return ROLE_MAP_KEY;
    }

    public static String getStsTokenKey(String providerName) {
        return String.format(STS_TOKEN_KEY, providerName);
    }

    public static String getSmsCodeKey(String tokenPrefix, SceneEnum sceneEnum, String mobile) {
        return String.format(SMS_CODE_KEY, tokenPrefix, sceneEnum.getCode(), mobile);
    }
}
